# 理解什么是类，为什么会有类


# 9.1 创造和使用类

class Dog():  ### 首字母大写，不能使用下划线
    """一次模拟小狗的简单测试"""

    def __init__(self,name,age): # init自动变色，self必须有
        """初始化属性name和age"""
        self.name=name
        self.age=age

    def sit(self):
        """模拟小狗被命令蹲下"""
        print(self.name.title()+" is now sitting.")

    def roll_over(self):
        """模拟小狗被命令时打滚"""
        print(self.name.title()+' rolled over!')

my_dog= Dog('willie', 6)
a=my_dog.name
print(a)
my_dog.sit()
my_dog.roll_over()

print("My dog's name is "+my_dog.name.title()+'.')
print("My dog is "+str(my_dog.age)+" years old.")

your_dog=Dog('lucy',3)
print("\nYour dog's name is "+your_dog.name.title()+'.')
print("Your dog is "+str(your_dog.age)+" years old.")
your_dog.sit()



# 9.2 汽车类
class Car():
    """一次模拟汽车的简单尝试"""

    def __init__(self,make,model,year):
        """初始化汽车描述的属性"""
        self.make=make
        self.model=model
        self.year=year

    def get_descriptive_name(self):
        """返回整洁的描述性信息"""
        long_name=str(self.year)+' '+self.make+' '+self.model
        return  long_name.title()

my_new_car=Car('audi','a4','2016')
print(my_new_car.get_descriptive_name())

#加入带默认值得属性，直接修改，防止回调
class Car():
    """一次模拟汽车的简单尝试"""

    def __init__(self,make,model,year):
        """初始化汽车描述的属性"""
        self.make=make
        self.model=model
        self.year=year
        self.odometer_reading=0

    def get_descriptive_name(self):
        """返回整洁的描述性信息"""
        long_name=str(self.year)+' '+self.make+' '+self.model
        return  long_name.title()

    def read_odometer(self):
        print("This car has "+str(self.odometer_reading)+' miles on it.')

    def update_odometer(self,mileage):
        """打印一条指出汽车里程的消息"""
        if mileage>=self.odometer_reading:
            self.odometer_reading=mileage
        else:
            print("You cannot roll back an odometer")


    def increment_odometer(self,miles):
        """将里程表读数增加指定的量"""
        self.odometer_reading+=miles



my_new_car=Car('audi','a4','2016')
print(my_new_car.get_descriptive_name())


my_used_car=Car('subaru','outback',2013)
print(my_used_car.get_descriptive_name())

my_used_car.update_odometer(23500)
my_used_car.read_odometer()

my_used_car.increment_odometer(100)
my_used_car.read_odometer()






# 9.3 继承
class Car():
    """一次模拟汽车的简单尝试"""

    def __init__(self,make,model,year):
        """初始化汽车描述的属性"""
        self.make=make
        self.model=model
        self.year=year
        self.odometer_reading=0

    def get_descriptive_name(self):
        """返回整洁的描述性信息"""
        long_name=str(self.year)+' '+self.make+' '+self.model
        return  long_name.title()

    def read_odometer(self):
        print("This car has "+str(self.odometer_reading)+' miles on it.')

    def update_odometer(self,mileage):
        """打印一条指出汽车里程的消息"""
        if mileage>=self.odometer_reading:
            self.odometer_reading=mileage
        else:
            print("You cannot roll back an odometer")


    def increment_odometer(self,miles):
        """将里程表读数增加指定的量"""
        self.odometer_reading+=miles

    def fill_gas_tank(self, gas):
        """汽车油箱还有多少油"""
        print('油箱还有：' + str(gas) + 'ml')



class ElectricCar(Car): # Car在前面，写在括号里
    """电动汽车的独特之处"""

    def __init__(self,make,model,year):
        """初始化父类的属性"""
        super().__init__(make,model,year)
        #super()是一个特殊的函数，调用父类属性
        self.battery_size=70

    def describe_battery(self):
        """打印一条描述电瓶容量的信息"""
        print("This car has a "+str(self.battery_size)+'-kWh battery.')

my_tesla=ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
